﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace SCIE_DAL
{
    /// <summary>
    /// Criada em: 01/05/2009
    ///       Por: Guilherme <deixapramim@gmail.com>
    /// Descrição: Classe resposanvel prover o objeto 
    /// de acesso a banco, bem como retornar um objeto
    /// do tipo base IDBCommand
    /// </summary>
    public class DataFactory
    {
        #region Métodos

        /// <summary>
        /// Método responsavel por obter 
        /// o nome da tabela gerador de sequences
        /// </summary>
        private static string sequence = "ETIQUETA";

        /// <summary>
        /// Metodo responsavel por criar a conexão com banco
        /// </summary>
        /// <returns>IDBConnection</returns>
        private IDbConnection CreateConnection()
        {
            SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["scie"].ConnectionString);
            return conn;
        }

        /// <summary>
        /// Metodo que dispara a criação de
        /// um objeto SqlCommand, retornando
        /// seu tipo base
        /// </summary>
        /// <returns>IDbCommand</returns>
        public IDbCommand CreateCommand()
        {
            return CreateCommand(String.Empty, CreateConnection());
        }

        /// <summary>
        /// Metodo que dispara a criação de
        /// um objeto SqlCommand, retornando
        /// seu tipo base
        /// </summary>
        /// <param name="commandText"></param>
        /// <returns>IDbCommand</returns>
        public IDbCommand CreateCommand(string commandText)
        {
            return CreateCommand(commandText, CreateConnection());
        }

        /// <summary>
        /// Metodo que dispara a criação de
        /// um objeto SqlCommand, retornando
        /// seu tipo base
        /// </summary>
        /// <param name="commandText"></param>
        /// <param name="connection"></param>
        /// <returns></returns>
        public IDbCommand CreateCommand(string commandText, IDbConnection connection)
        {
            return new SqlCommand(commandText,
                (SqlConnection)connection);
        }

        /// <summary>
        /// Metodo responsavel por gerar novas etiquetas
        /// </summary>
        /// <returns></returns>
        public int ObterUltimaEtiqueta()
        {
            string commandText = String.Format("SELECT MAX(id) FROM {0}", sequence);
            IDbCommand comando = CreateCommand(commandText);
            int ultimaEtiqueta = 0;
            try
            {
                comando.Connection.Open();
                object obj = comando.ExecuteScalar();
                if (obj.Equals(DBNull.Value))
                    ultimaEtiqueta = -1;
                else
                    ultimaEtiqueta = Convert.ToInt32(obj);
            }
            finally
            {
                comando.Dispose();
            }
            return ultimaEtiqueta;
        }

        #endregion
    }
}
